//
//  AppDelegate.swift
//  MasterBoy
//
//  Created by kyson on 2023/3/15.
//

import UIKit
import Toast_Swift

import UserNotifications
import Dispatch


#if DEBUG
    // 在调试模式下运行的代码
//import DoraemonKit
//import FLEX

#else



    // 在发布模式下运行的代码
#endif


@main

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        window = UIWindow.init(frame: UIScreen.main.bounds)
        let tarbar = MBDTabBarController()
        window?.rootViewController = tarbar
        window?.makeKeyAndVisible()
        
//        FirebaseApp.configure()
        
        //启动 Google 移动广告 SDK。尽早调用此方法可以减少会话第一个广告请求的延迟。当 GMA SDK 和所有中介网络时调用completionHandler 已完全设置或设置超时。如果未调用此方法，Google 移动广告 SDK 将在第一个广告请求时启动。
//        GADMobileAds.sharedInstance().start(completionHandler: nil)
        
#if DEBUG
    // 在调试模式下运行的代码
//        DoraemonManager.shareInstance().install()
//        GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers = [ "71f2a7148792cf06e3f62e745669f136" ]
        
//        FLEXManager.shared.showExplorer()

#else
    // 在发布模式下运行的代码
#endif
        MBDNetworkManager.shared.startListening()
        
        MBDRouter.shared.registeRouter()
        
        XGPush.defaultManager().configureClusterDomainName("tpns.sh.tencent.com")
        XGPush.defaultManager().isEnableDebug = true
        //ba7f54398e345cf1aecf2c9279615921
        XGPush.defaultManager().startXG(withAccessID: 1680018856, accessKey: "IRWH1V0SLJDS", delegate: self)
        
//        //弹出推送弹框
//        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
//            if granted {
//                DispatchQueue.main.async {
//                    UIApplication.shared.registerForRemoteNotifications()
//                }
//            } else {
//                // 用户拒绝了推送通知授权
//            }
//        }
        

        return true
    }
    
    func applicationWillEnterForeground(_ application: UIApplication) {
        
    
//        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
//            // your code here
//            MBDAccountInfoModel.fetch()
//        }
        
    }


}

extension AppDelegate : XGPushDelegate {
    func xgPushDidReceiveRemoteNotification(_ notification: Any, withCompletionHandler completionHandler: ((UInt) -> Void)? = nil) {
        
    }
    
    func xgPushDidRegisteredDeviceToken(_ deviceToken: String?, xgToken: String?, error: (any Error)?) {
        print(deviceToken ?? "")
        print(xgToken ?? "")

    }
    
    func xgPushDidFailToRegisterDeviceTokenWithError(_ error: (any Error)?) {
        
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {
    // ...
    
    

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        // 将设备令牌发送到你的服务器，用于将推送通知发送到该设备
        debugPrint(token)
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // 注册推送通知失败
    }

    // 在应用前台收到推送通知时调用
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // 处理接收到的推送通知，例如显示警报或更新应用的界面
        completionHandler([.alert, .sound, .badge])
    }

    // 在用户点击推送通知时调用
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        // 处理用户点击推送通知的操作，例如打开特定的界面或执行特定的操作
        completionHandler()
    }

    // ...
    /**
     在上述代码中，`didRegisterForRemoteNotificationsWithDeviceToken` 方法会在成功注册推送通知时被调用，并返回设备的令牌。你可以将设备令牌发送到你的服务器，以便将来发送推送通知给该设备。

     ``didFailToRegisterForRemoteNotificationsWithError` 方法会在注册推送通知失败时被调用。你可以在此方法中处理错误情况。

     ``userNotificationCenter(_:willPresent:withCompletionHandler:)` 方法会在应用前台接收到推送通知时被调用，你可以在此方法中处理接收到的通知并决定是否显示警报、播放声音或更新应用的图标标记数。

     ``userNotificationCenter(_:didReceive:withCompletionHandler:)` 方法会在用户点击推送通知时被调用，你可以在此方法中处理用户的操作，例如打开特定的界面或执行特定的操作。
     
     
     */
}
